import store from '@/store'
import { getToken, getId } from '@/utils/auth' // 从cookie获取令牌
var CryptoJS = require('crypto-js') // encryption

/**
 * HmacSHA1加密方法
 * @method encryptionData(data,url)
 * @param {obj} data 待提交的参数对象
 * @param {string} url
 * @return {obj} param 返回{accessToken,userId,timestamp,signature}
 */
export function encryptionData(data, url) {
  if (data instanceof Object) {
    // var urlData = url // url
    var urlData = 'c25a1809b3399650ed4699691b4ab714' // url
    var accessToken = getToken() // accessToken
    var userId = getId() // 用户id
    var timestamp = new Date().valueOf() // 时间戳

    var dataObj = {}
    dataObj = JSON.parse(JSON.stringify(data)) // 复制 提交的参数对象
    dataObj.accessToken = accessToken
    dataObj.userId = userId
    dataObj.timestamp = timestamp

    /* 加密 */
    var shaDataArr = []// 拼接待加密的参数，[key1 + val1, key2 + val2, ...]
    Object.keys(dataObj).forEach(function (key) {
      if (dataObj[key] !== null) {
        shaDataArr.push(key + (dataObj[key] === undefined ? '' : dataObj[key]))
      }
    })

    shaDataArr.sort()// 拼接后的数组排序
    shaDataArr.unshift(urlData) // 拼接后的数组开头拼接上url
    var sign = shaDataArr.join('')// 数组拼接成字符串
    /* （keyVal字符串，token为key）进行加密 */
    // var signature = CryptoJS.HmacSHA1(sign, accessToken).toString(CryptoJS.enc.Hex)
    var signature = CryptoJS.MD5(sign).toString(CryptoJS.enc.Hex)

    // console.log(shaDataArr, urlData)
    /* param */
    var param = {}
    param.accessToken = accessToken
    param.userId = userId
    param.timestamp = timestamp
    param.signature = signature

    return param
  } else {
    console.log('data类型错误，应为obj')
  }
}

/**
 * 图片转base64方案
 * @method getBase64(file)
 * @param {obj} file 图片文件
 * @return {string} imgData base64数据
 */
export function getBase64(file) {
  return new Promise(function (resolve, reject) {
    const reader = new FileReader()
    let imgResult = ''
    reader.readAsDataURL(file)
    reader.onload = function () {
      imgResult = reader.result
    }
    reader.onerror = function (error) {
      reject(error)
    }
    reader.onloadend = function () {
      resolve(imgResult)
    }
  })
}

/**
 * 图片url转base64方案
 * @method getUrlBase64(file)
 * @param {String} imgUrl 图片url
 * @return {String} imgData base64数据
 */
export function getUrlBase64(imgUrl) {
  return new Promise(function (resolve, reject) {
    let base64 = ''
    window.URL = window.URL || window.webkitURL;
    var xhr = new XMLHttpRequest();
    xhr.open("get", imgUrl, true);
    // 至关重要
    xhr.responseType = "blob";
    xhr.onload = function () {
      if (this.status == 200) {
        //得到一个blob对象
        var blob = this.response;
        // 至关重要
        let oFileReader = new FileReader();
        oFileReader.onloadend = function (e) {
          // 此处拿到的已经是 base64的图片了
          base64 = e.target.result;
          resolve(base64)
        };
        oFileReader.readAsDataURL(blob);
      }
    }
    xhr.send();
  })
}

/**
 * 判断图片格式
 * @method verifyImgType(file,verifyType)
 * @param {obj} file 图片文件
 * @param {array} fileType 限定的图片的格式
 * @return { boolean } res 返回判断结果
 */
export function verifyImgType(file, verifyType) {
  return new Promise(function (resolve, reject) {
    var verifyTypeStr = verifyType.join('、')
    let arr = file.raw.type.split('/')
    var fileType = arr[arr.length - 1]
    var result = false
    var msg = '只能上传格式为' + verifyTypeStr + '格式的文件！此文件格式为' + fileType

    for (var i = 0; i < verifyType.length; i++) {
      if (fileType === verifyType[i]) {
        return resolve({
          result: true,
          msg: ''
        })
      }
    }
    resolve({
      result,
      msg
    })
  })
}

/**
 * 效验输入值
 * @method verifyVal(verifyType, value)
 * @param {string} verifyType 输入类型限制
 * @param {string} value 输入的值
 * @return { string } res 返回过滤结果
 */
export function verifyVal(verifyType, value) {
  let newVal = ''
  if (value !== '' && value !== null && value !== undefined) {
    switch (verifyType) {
      // 大于0的正整数
      case 'num_2':
        if (value[1] == 1 || value[1] == 3) {
          newVal = (value[0].length == 1) ? value[0].replace(/[^1-9]/g, '') : value[0].replace(/\D/g, '')
        } else if (value[1] == 2) {
          newVal = value.replace(/[^\d.]/g, '') // 先把非数字的都替换掉，除了数字和.
          newVal = newVal.replace(/^\./g, '') // 必须保证第一个为数字而不是.
          newVal = newVal.replace(/\.{2,}/g, '.') // 保证只有出现一个.而没有多个.
          newVal = newVal.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.') // 保证.只出现一次，而不能出现两次以上
          newVal = newVal.replace(/^(\-)*(\d+)\.(\d).*$/, '$1$2.$3') // 只能输入一个小数
          break
        }
        break
      // 大于0的正整数
      case 'num_1':
        newVal = (value.length == 1) ? value.replace(/[^1-9]/g, '') : value.replace(/\D/g, '')
        break
      // 正整数
      case 'num':
        newVal = value.replace(/[^\d+$]/g, '')
        break
      // 数字+字母
      case 'numLetter':
        newVal = value.replace(/[^\w\.\/]/ig, '')
        break
      // 1个小数点的数字
      case 'numOne':
        newVal = value.replace(/[^\d.]/g, '') // 先把非数字的都替换掉，除了数字和.
        newVal = newVal.replace(/^\./g, '') // 必须保证第一个为数字而不是.
        newVal = newVal.replace(/\.{2,}/g, '.') // 保证只有出现一个.而没有多个.
        newVal = newVal.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.') // 保证.只出现一次，而不能出现两次以上
        newVal = newVal.replace(/^(\-)*(\d+)\.(\d).*$/, '$1$2.$3') // 只能输入一个小数
        break
      // 2个小数点的数字
      case 'numTwo':
        newVal = value.replace(/[^\d.]/g, '') // 先把非数字的都替换掉，除了数字和.
        newVal = newVal.replace(/^\./g, '') // 必须保证第一个为数字而不是.
        newVal = newVal.replace(/\.{2,}/g, '.') // 保证只有出现一个.而没有多个.
        newVal = newVal.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.') // 保证.只出现一次，而不能出现两次以上
        newVal = newVal.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3') // 只能输入两个小数
        break
      // 数字、字母和"-"
      case 'numName':
        newVal = value.replace(/[^\d.]/g, '') // 先把非数字的都替换掉，除了数字和.
        newVal = newVal.replace(/^\./g, '') // 必须保证第一个为数字而不是.
        newVal = newVal.replace(/\.{2,}/g, '.') // 保证只有出现一个.而没有多个.
        newVal = newVal.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.') // 保证.只出现一次，而不能出现两次以上
        newVal = newVal.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3') // 只能输入两个小数
        break
      // 0-5之间的小数,限制一位小数点
      case 'numFive':
        if (!(/^[0-9]+(.[0-9]{0,1})?$/.test(value))) {
        // if (!(/^[0-5]\.?\d{0,1}$/gi.test(value))) {
          newVal = ''
        } else if (value > 5) {
          newVal = '5'
        } else if (value < 0) {
          newVal = '0'
        } else {
          newVal = value
        }
        break
      // 字符间去空格
      case 'trim':
        newVal = value.replace(/\s+/ig , '')
        break
      // 字符间去空格 纯数字
      case 'trimNum':
        newVal = value.replace(/\s+/ig , '').replace(/[^\d.]/g, '')
        break
      case 'atrim':
        var ac =  /^[a-zA-Z][a-zA-Z0-9_]*$/
        if (ac.test(value)) {
          newVal = value
        } else {
          newVal = ''
        }
        break
    }
  }

  return newVal
}
/**
 * 数字格式化两位小数
 * @method toFixedTwo(value)
 * @param {Number} value
 * @return { Number } value.toFixed（2）
 */
export function toFixedTwo(value) {
  if (value !== undefined && value.length !== 0 && value !== '') {
    value = Number(value)
    return value.toFixed(2)
  } else {
    return '0.00'
  }
}

/**
 * 格式化指定位置的字符串成*
 * @method toEncrypt(value,)
 * @param {value} value 待替换字符串
 * @param {startIndex} startIndex 开始下标
 * @param {length} length 长度
 * @return { String } xxx***xxxx
 */
export function toEncrypt(value, startIndex, length) {
  if (value !== undefined && value.length !== 0 && value !== '') {
    const encryptStr = value.toString().substr(startIndex - 1, length)
    let replaceStr = ''
    for (var i = 0; i < length; i++) {
      replaceStr += '*'
    }
    value = value.replace(encryptStr, replaceStr)
    return value
  }
}

/**
 * 长期按钮 - 结束日期范围设置9999-12-31
 * @method setLongTime(value)
 * @param {value} value 时间值
 * @return {  }
 */
export function setLongTime(_that, value) {
  return new Promise(function (resolve, reject) {
    if (value.length > 1) {
      _that.$set(value, 1, '9999-12-31')
      resolve()
    } else {
      _that.$message({
        message: '您还没有选择开始日期',
        type: 'error',
        duration: 2000
      })
    }
  })
}

/**
 * 日期格式化
 * @method formatDate(date, fmt)
 * @param {date} date 待格式化的值 const date = new Date(time)
 * @param {fmt} fmt 格式 'yyyy-MM-dd hh:mm:ss'
 * @return { String }
 */
export function formatDate(date, fmt) {
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
  }
  const o = {
    'M+': date.getMonth() + 1,
    'd+': date.getDate(),
    'h+': date.getHours(),
    'm+': date.getMinutes(),
    's+': date.getSeconds()
  }
  for (const k in o) {
    if (new RegExp(`(${k})`).test(fmt)) {
      const str = o[k] + ''
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str))
    }
  }

  if (fmt === 'NaN-aN-aN aN:aN:aN') {
    fmt = ''
  }

  return fmt
}

function padLeftZero(str) {
  return ('00' + str).substr(str.length)
}

export function str2Date(dateStr, separator) {
  if (!separator) {
    separator = '-'
  }
  const dateArr = dateStr.split(separator)
  const year = parseInt(dateArr[0])
  let month
  // 处理月份为04这样的情况
  if (dateArr[1].indexOf('0') === 0) {
    month = parseInt(dateArr[1].substring(1))
  } else {
    month = parseInt(dateArr[1])
  }
  const day = parseInt(dateArr[2])
  const date = new Date(year, month - 1, day)

  return date
}
